/**
 * 命名空间内的标识符解析
 *   如果使用命名空间内的标识符并且未提供范围解析，则编译器将首先尝试在同一命名空间中查找匹配的声明。
 *   如果没有找到匹配的标识符，编译器将按顺序检查每个包含名称空间以查看是否找到匹配项，最后检查全局名称空间。
 * 
 * 允许多个命名空间块
 *   在多个位置（跨多个文件或同一文件中的多个位置）声明名称空间块是合法的。命名空间内的所有声明都被视为命名空间的一部分。
 * 警告
 *   不要将自定义功能添加到 std 命名空间。
 * 
 * 嵌套命名空间
 *   命名空间可以嵌套在其他命名空间内。
 * 从 C++17 开始，嵌套命名空间也可以这样声明：
 *   namespace Foo::Goo {...}
 * 
 * 命名空间别名
 *   因为在嵌套命名空间中输入变量或函数的限定名称可能会很痛苦，所以 C++ 允许您创建命名空间别名
 *   namespace Active = Foo::Goo
 *   Active::dosomething()
 * 
 * 何时应该使用命名空间
 *   在应用程序中，命名空间可用于将特定于应用程序的代码与以后可重用的代码（例如数学函数）分开。
 *   例如，物理和数学函数可以进入一个名称空间（例如Math::）。语言和本地化功能在另一个（例如Lang::）中。
 * 
 * 当您编写要分发给其他人的库或代码时，请始终将代码放在命名空间中。
 * 您的库所使用的代码可能不遵循最佳实践——在这种情况下，如果您的库的声明不在命名空间中，则发生命名冲突的机会就会增加。
 * 作为另一个优点，将库代码放置在命名空间内还允许用户通过使用编辑器的自动完成和建议功能来查看库的内容。
 * 
 */

#include <iostream>

namespace Foo {
    const char* dosomething() {
        return "foo";
    }
}

namespace Goo {
    const char* dosomething() {
        return "goo";
    }
}

int main() {
    const char* info = Foo::dosomething();
    std::cout << "info: " << info << "\n";

    return 0; // 在main函数中可以省略
}